// 对整数数组进行冒泡排序，从小到大arr[5]={1,4,2,5,3}
#include <stdio.h>
/**
 * 使用异或交换两个数
 */
void swapNum(int *const num1, int *const num2)
{
    *num1 = *num1 ^ *num2;
    *num2 = *num1 ^ *num2;
    *num1 = *num1 ^ *num2;
}
/**
 * 冒泡排序
 */
void bubbleSort(int *arr, int arrLength)
{
    printf("bubbling bubbling bubbling bubbling\n");
    for (int i = 0; i < arrLength - 1; i++)
    {
        // 标志位，用于判断是否发生交换，如果一轮下来没有交换，说明数组已经有序，可以提前结束排序
        int swapped = 0;

        for (int j = 0; j < arrLength - i - 1; j++)
        {
            if (arr[j] > arr[j + 1])
            {
                // 交换元素
                swapNum(&arr[j], &arr[j + 1]);
                // 设置标志位为 1，表示发生了交换
                swapped = 1;
            }
        }

        // 如果没有发生交换，说明数组已经有序，可以提前结束排序
        if (!swapped)
        {
            break;
        }
    }
}
/**
 * 遍历输出数组
 */
void printfArr(int *arr, int arrLength)
{
    printf("print array: \n");
    while (arrLength > 0)
    {

        printf_s("%d", *arr); // 对指针进行解引用，输出该元素

        // 如果不是最后一个数  就输出一个 " , "
        if (arrLength > 1)
        {
            printf(",");
        }

        arr += 1;       // 指针后移
        arrLength -= 1; // 数组的长度也就是-->待遍历的元素的个数  !!!那么每输出一个元素，待遍历的个数就-1
    }
    printf("\nend print \n");
}
int main()
{
    int arr[] = {1, 4, 2, 5, 3};
    // 计算数组长度
    int arrLength = sizeof(arr) / sizeof(arr[0]);
    // 排序之前输出数组
    printfArr(arr, arrLength);
    // 进行冒泡排序
    bubbleSort(arr, arrLength);
    // 进行排序后输出数组
    printfArr(arr, arrLength);
    return 0;
}
